// 导入io标准库
use rand::Rng; //trait  接口
use std::cmp::Ordering;
use std::io; // prelude

fn main() {
    // 宏  ，宏和方法的区别就是带不带！
    println!("猜数字");

    let secret_number = rand::thread_rng().gen_range(1..101); // i32 u32 i64

    // println!("神秘数字是 {}", secret_number);

    loop {
        println!("开始猜测");

        /*
         * 直接let声明的是不可变的变量，使用mut 就是可变变量
         * String::new()  String:utf-8
         * ::关联符号  ::new() 创建一个string函数的空白字符串对象
         */
        let mut guess_num = String::new();

        /*
         * stdin()：句柄   控制终端输入   处理终端中的标准输入
         * expect 返回的是一个Result类型 = 枚举类型（OK | ERR）
         */
        io::stdin().read_line(&mut guess_num).expect("无法读取行");

        // 允许使用同名的新变量去隐藏旧变量，通常用在需要转换的变量

        let guess_num: u32 = match guess_num.trim().parse() {
            Ok(num) => num,
            Err(_) => continue,
        };

        // 比较大小
        match guess_num.cmp(&secret_number) {
            Ordering::Less => println!("小了"),
            Ordering::Equal => {
                println!("猜对了");
                break;
            }
            Ordering::Greater => println!("大了"),
        }

        // println!("你猜测的数字是：{}", guess_num)
    }
}
